﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Text;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Forms;
using System.Xml.Linq;
using Newtonsoft.Json.Linq;
using SecsEquip;


namespace EquipSecs300
{
    public partial class ConnectControlView : CMyFormEx
    {
        public ConnectControlView()
        {
            InitializeComponent();
        }

        // 通讯
        private void checkBoxEnableComm_CheckedChanged(object sender, EventArgs e)
        {
            if (checkBoxEnableComm.Checked)
            {
                m_pSecs.CommEnable();
            }
            else
            {
                m_pSecs.CommDisable();
            }
        }

        // 控制模式
        private void checkBoxOnlineControl_CheckedChanged(object sender, EventArgs e)
        {
            OnLineControlMode();
        }

        // 在线控制模式：远程
        private void radioBtnRemote_CheckedChanged(object sender, EventArgs e)
        {
            // 只需一个触发
            // C#的BUG问题
            OnLineControlMode();
        }

        void OnLineControlMode()
        {
            bool bOnLine = checkBoxOnlineControl.Checked;
            bool bRemote = false;
            CONTROL_MODE state;

            if (radioBtnRemote.Checked)
            {
                bRemote = true;
            }
            else
            {
                bRemote = false;
            }

            // 判断状态
            if (bOnLine && bRemote)
            {
                state = SecsEquip.CONTROL_MODE.eCONTROL_MODE_ONLINE_REMOTE;
            }
            else if (bOnLine && !bRemote)
            {
                state = SecsEquip.CONTROL_MODE.eCONTROL_MODE_ONLINE_LOCAL;
            }
            else
            {
                state = SecsEquip.CONTROL_MODE.eCONTROL_MODE_OFFLINE;
            }

            m_pSecs.SetControlMode(state);
        }

        private void timer1_Tick(object sender, EventArgs e)
        {

        }

        int timeCount;
        bool trigFlag;
        bool trigFlag_2;
        void ConnectTask()
        {
            if (!trigFlag)
            {
                trigFlag = true;
                checkBoxOnlineControl.Checked = false;
                radioBtnRemote.Checked = false;
                OnLineControlMode();
            }

            if (timeCount < 5000 / timer1.Interval)
            {
                timeCount++;
            }
            else if (!trigFlag_2)
            {
                trigFlag_2 = true;
                switch (SecsParameterHelper.SecsParam.ControlMode)
                {
                    case CONTROL_MODE.eCONTROL_MODE_ONLINE_LOCAL:
                        {
                            checkBoxOnlineControl.Checked = true;
                            radioBtnLocal.Checked = true;
                            OnLineControlMode();
                        }
                        break;
                    case CONTROL_MODE.eCONTROL_MODE_ONLINE_REMOTE:
                        {
                            radioBtnRemote.Checked = true;
                            checkBoxOnlineControl.Checked = true;
                            OnLineControlMode();
                        }
                        break;
                    default:
                        break;
                }
            }


        }

        #region
        //private void btnTest_Click(object sender, EventArgs e)
        //{
        //    var prm = new Prm();
        //    DictRecipeItem.Clear();
        //    DictRecipeItemType.Clear();
        //    GetRecipeItem(prm, "");
        //}

        //public static Dictionary<string, string> DictRecipeItem { get; set; } = new Dictionary<string, string>();
        //public static Dictionary<string, string> DictRecipeItemType { get; set; } = new Dictionary<string, string>();
        //private static void GetRecipeItem(object obj, string strName)
        //{
        //    if (obj == null)
        //    {
        //        return;
        //    }

        //    Type trainType = obj.GetType();
        //    PropertyInfo[] trainPropertyInfos = trainType.GetProperties();
        //    foreach (PropertyInfo trainPropertyInfo in trainPropertyInfos)
        //    {
        //        string name = string.IsNullOrEmpty(strName) ? trainPropertyInfo.Name : strName + "." + trainPropertyInfo.Name;

        //        Type propertyType = trainPropertyInfo.PropertyType;
        //        bool isCustomClass = propertyType.IsCustomClass();
        //        bool isArray = propertyType.IsArrayType();
        //        bool isList = propertyType.IsListNotArray();
        //        bool isDic = propertyType.IsDictionaryType();
        //        if (isCustomClass)
        //        {
        //            GetRecipeItem(trainPropertyInfo.GetValue(obj), name);
        //        }
        //        else if (isArray)
        //        {
        //            Type elementType = propertyType.GetElementType();
        //            var array = (Array)trainPropertyInfo.GetValue(obj, null);
        //            int n = 0;
        //            foreach (var item in array)
        //            {
        //                GetRecipeItem(item, name + $"[{n}]");
        //                n++;
        //            }
        //        }
        //        else if (isList)
        //        {
        //            Type[] genericArguments = propertyType.GetGenericArguments();
        //            var list = (IList)trainPropertyInfo.GetValue(obj, null);
        //            int n = 0;
        //            foreach (var item in list)
        //            {
        //                GetRecipeItem(item, name + $"[{n}]");
        //                n++;
        //            }
        //        }
        //        else if (isDic)
        //        {
        //            Type keyType = propertyType.GetGenericArguments()[0];
        //            Type valueType = propertyType.GetGenericArguments()[1];
        //            var dec = (IDictionary)trainPropertyInfo.GetValue(obj, null);
        //            foreach (DictionaryEntry item in dec)
        //            {
        //                GetRecipeItem(item.Value, name + $"[{item.Key}]");
        //            }
        //        }
        //        else
        //        {
        //            Dictionary<string, string> item = new Dictionary<string, string>();
        //            DictRecipeItem.Add(name, trainPropertyInfo.GetValue(obj).ToString());
        //            DictRecipeItemType.Add(name, trainPropertyInfo.PropertyType.Name);
        //        }
        //    }
        //    if (trainPropertyInfos.Length <= 0)
        //    {
        //        DictRecipeItem.Add(strName, obj.ToString());
        //        DictRecipeItemType.Add(strName, obj.GetType().Name);
        //    }
        //}

        //private void btnTest2_Click(object sender, EventArgs e)
        //{
        //    var prm = new Prm();
        //    SetRecipeItem(prm, "");
        //}

        //private static void SetRecipeItem(object obj, string strName)
        //{
        //    if (obj == null)
        //    {
        //        return;
        //    }

        //    Type trainType = obj.GetType();
        //    PropertyInfo[] trainPropertyInfos = trainType.GetProperties();
        //    foreach (PropertyInfo trainPropertyInfo in trainPropertyInfos)
        //    {
        //        string name = string.IsNullOrEmpty(strName) ? trainPropertyInfo.Name : strName + "." + trainPropertyInfo.Name;

        //        Type propertyType = trainPropertyInfo.PropertyType;
        //        bool isCustomClass = propertyType.IsCustomClass();
        //        bool isArray = propertyType.IsArrayType();
        //        bool isList = propertyType.IsListNotArray();
        //        bool isDic = propertyType.IsDictionaryType();
        //        bool b1 = propertyType.IsListType();
        //        bool b2 = propertyType.IsDictionaryType_2();
        //        bool b3 = propertyType.IsListType_2();

        //        if (isCustomClass)
        //        {
        //            SetRecipeItem(trainPropertyInfo.GetValue(obj), name);
        //        }
        //        else if (isArray)
        //        {
        //            Type elementType = propertyType.GetElementType();
        //            bool isCustomClassElement = elementType.IsCustomClass();

        //            var array = (Array)trainPropertyInfo.GetValue(obj, null);
        //            Type type = array.GetType();

        //            int n = 0;
        //            foreach (var item in array)
        //            {
        //                if (isCustomClassElement)
        //                {
        //                    SetRecipeItem(item, name + $"[{n}]");
        //                    n++;
        //                }
        //                else
        //                {
        //                    MethodInfo setValueMethod = type.GetMethod("SetValue", new Type[] { typeof(object), typeof(int) });
        //                    foreach (var recipeItem in DictRecipeItem)
        //                    {
        //                        string nameTemp = name + $"[{n}]";
        //                        if (nameTemp == recipeItem.Key)
        //                        {
        //                            if (!DictRecipeItemType.ContainsKey(nameTemp))
        //                            {
        //                                continue;
        //                            }
        //                            string typeName = DictRecipeItemType[nameTemp];
        //                            int index1 = nameTemp.LastIndexOf("[");
        //                            int index2 = nameTemp.LastIndexOf("]");
        //                            var strIndex = nameTemp.Substring(index1 + 1, index2 - index1 - 1);
        //                            int intIndex = UtilitiesConvert.StringToInt(strIndex);
        //                            switch (typeName)
        //                            {
        //                                case "Boolean":
        //                                    {
        //                                        bool value = UtilitiesConvert.StrStrToBool(recipeItem.Value);
        //                                        setValueMethod.Invoke(array, new object[] { value, n });
        //                                    }
        //                                    break;
        //                                case "Int32":
        //                                    {
        //                                        int value = UtilitiesConvert.StringToInt(recipeItem.Value);
        //                                        setValueMethod.Invoke(array, new object[] { value, n });
        //                                    }
        //                                    break;
        //                                case "Double":
        //                                    {
        //                                        double value = UtilitiesConvert.StringToDouble(recipeItem.Value);
        //                                        setValueMethod.Invoke(array, new object[] { value, n });
        //                                    }
        //                                    break;
        //                                case "String":
        //                                    {
        //                                        string value = recipeItem.Value;
        //                                        setValueMethod.Invoke(array, new object[] { value, n });
        //                                    }
        //                                    break;
        //                                default:
        //                                    break;
        //                            }
        //                        }
        //                    }
        //                    n++;
        //                }
        //            }
        //        }
        //        else if (isList)
        //        {
        //            Type[] genericArguments = propertyType.GetGenericArguments();
        //            bool isCustomClassElement = UtilitiesType.IsCustomClass(genericArguments[0]);

        //            var list = (IList)trainPropertyInfo.GetValue(obj, null);
        //            Type type = list.GetType();

        //            int n = 0;
        //            for (int i = 0; i < list.Count; i++)
        //            {
        //                if (isCustomClassElement)
        //                {
        //                    SetRecipeItem(list[i], name + $"[{n}]");
        //                    n++;
        //                }
        //                else
        //                {
        //                    MethodInfo setValueMethod = type.GetMethod("set_Item");
        //                    foreach (var recipeItem in DictRecipeItem)
        //                    {
        //                        string nameTemp = name + $"[{n}]";
        //                        if (nameTemp == recipeItem.Key)
        //                        {
        //                            if (!DictRecipeItemType.ContainsKey(nameTemp))
        //                            {
        //                                continue;
        //                            }
        //                            string typeName = DictRecipeItemType[nameTemp];
        //                            int index1 = nameTemp.LastIndexOf("[");
        //                            int index2 = nameTemp.LastIndexOf("]");
        //                            var strIndex = nameTemp.Substring(index1 + 1, index2 - index1 - 1);
        //                            int intIndex = UtilitiesConvert.StringToInt(strIndex);
        //                            switch (typeName)
        //                            {
        //                                case "Boolean":
        //                                    {
        //                                        bool value = UtilitiesConvert.StrStrToBool(recipeItem.Value);
        //                                        setValueMethod.Invoke(list, new object[] { n, value });
        //                                    }
        //                                    break;
        //                                case "Int32":
        //                                    {
        //                                        int value = UtilitiesConvert.StringToInt(recipeItem.Value);
        //                                        setValueMethod.Invoke(list, new object[] { n, value });
        //                                    }
        //                                    break;
        //                                case "Double":
        //                                    {
        //                                        double value = UtilitiesConvert.StringToDouble(recipeItem.Value);
        //                                        setValueMethod.Invoke(list, new object[] { n, value });
        //                                    }
        //                                    break;
        //                                case "String":
        //                                    {
        //                                        string value = recipeItem.Value;
        //                                        setValueMethod.Invoke(list, new object[] { n, value });
        //                                    }
        //                                    break;
        //                                default:
        //                                    break;
        //                            }
        //                        }
        //                    }
        //                    n++;
        //                }
        //            }

        //        }
        //        else if (isDic)
        //        {
        //            Type keyType = propertyType.GetGenericArguments()[0];
        //            Type valueType = propertyType.GetGenericArguments()[1];
        //            var dec = (IDictionary)trainPropertyInfo.GetValue(obj, null);
        //            foreach (DictionaryEntry item in dec)
        //            {
        //                SetRecipeItem(item.Value, name + $"[{item.Key}]");
        //            }
        //        }
        //        else
        //        {
        //            foreach (var item in DictRecipeItem)
        //            {
        //                if (name == item.Key)
        //                {
        //                    SetRecipeItemValue(trainPropertyInfo, item, obj, name);
        //                }
        //            }
        //        }
        //    }
        //}

        //private static void SetRecipeItemValue(PropertyInfo trainPropertyInfo, KeyValuePair<string, string> item, object obj, string name)
        //{
        //    string typeName = DictRecipeItemType[name];
        //    switch (typeName)
        //    {
        //        case "Boolean":
        //            {
        //                bool n = UtilitiesConvert.StrStrToBool(item.Value);
        //                trainPropertyInfo.SetValue(obj, n);
        //            }
        //            break;
        //        case "Int32":
        //            {
        //                int n = UtilitiesConvert.StringToInt(item.Value);
        //                trainPropertyInfo.SetValue(obj, n);
        //            }
        //            break;
        //        case "Double":
        //            {
        //                double n = UtilitiesConvert.StringToDouble(item.Value);
        //                trainPropertyInfo.SetValue(obj, n);
        //            }
        //            break;
        //        case "String":
        //            {
        //                string n = item.Value;
        //                trainPropertyInfo.SetValue(obj, n);
        //            }
        //            break;
        //        default:
        //            break;
        //    }
        //}
        #endregion

    }
}
